
/*
** client.c -- a stream socket client demo
*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/times.h>
#include <sys/wait.h>

#define PORT 4243    /* the port client will be connecting to */

#define MAXDATASIZE 200 /* max number of bytes we can get or send at once */
int main(int argc, char *argv[])
{
    int sockfd, sendlinecount=0, recvlinecount=0, maxline=0, sendcharcount=0, recvcharcount=0;  
    int numbytes=0;
    char buf_send[MAXDATASIZE];
    char buf_recv[MAXDATASIZE];
    struct hostent *he;
    struct sockaddr_in their_addr; /* connector's address information */
    struct tms str_start_time, str_stop_time;
    double time;
    static clock_t start_time, stop_time;
    FILE *wsock, *rsock;
    
    
    if (argc != 2) {
        fprintf(stderr,"usage: client hostname\n");
        exit(1);
    }

    if ((he=gethostbyname(argv[1])) == NULL) {  /* get the host info */
        perror("gethostbyname");
        exit(1);
    }

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    their_addr.sin_family = AF_INET;         /* host byte order */
    their_addr.sin_port = htons(PORT);     /* short, network byte order */
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(their_addr.sin_zero), 8);        /* zero the rest of the struct */

    start_time=times(&str_start_time);

    if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
        perror("connect");
        exit(1);
    }
    
	if (fork()) {
		wsock = fdopen(sockfd,"w+");
		while (fgets(buf_send, MAXDATASIZE, stdin) != NULL) {
		  
		  if ((fputs(buf_send,wsock)) == EOF) {
			perror("write");
			exit(1);
		  }
		  
		  numbytes = strlen(buf_send);
		  
		  fflush(wsock);
		  
		  if(numbytes > maxline) {
			maxline = numbytes-1;
		  }
		  sendcharcount += numbytes;
		  sendlinecount++;
		}
		
		shutdown(sockfd, SHUT_WR);
		fclose(wsock);
		
		wait(NULL);

		fprintf(stderr,"Numero de linhas enviadas: %d\nTamanho em caracteres da maior linha: %d\nNumero total de caracteres enviados: %d\n", sendlinecount, maxline, sendcharcount);
	} else {
		rsock = fdopen(sockfd,"r+");
		while (fgets(buf_recv,MAXDATASIZE,rsock) != NULL) {
		
			numbytes = strlen(buf_recv);
			
			fflush(rsock);
			recvcharcount += numbytes;
			recvlinecount++;

			buf_recv[strlen(buf_recv)+1] = '\0';
			fputs(buf_recv, stdout);
		}
		
		close(sockfd);
		fclose(rsock);
		
		stop_time=times(&str_stop_time);
		time=((double)stop_time-(double)start_time)/(double)sysconf(_SC_CLK_TCK);
		fprintf(stderr,"Numero de linhas recebidas: %d\nNumero total de caracteres recebidos: %d\nTempo: %lf\n", recvlinecount, recvcharcount, time);
	}
    return 0;
}



